# 二进制文件
# 前面讲的默认都是读取文本文件，并且是UTF-8编码的文本文件。要读取二进制文件，比如图片、视频等等，用'rb'模式打开文件即可：
with open('./00.readme.md','rb') as file:
    print(file.read())

# 字符编码
# 要读取非UTF-8编码的文本文件，需要给open()函数传入encoding参数，例如，读取GBK编码的文件：
with open('./00.readme.md','r',encoding="utf8") as file:
    print(file.read())
# 遇到有些编码不规范的文件，你可能会遇到UnicodeDecodeError，因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况，open()函数还接收一个errors参数，表示如果遇到编码错误后如何处理。最简单的方式是直接忽略：
# f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

print("============================")
# 你可以反复调用write()来写入文件，但是务必要调用f.close()来关闭文件。
# 当我们写文件时，操作系统往往不会立刻把数据写入磁盘，而是放到内存缓存起来，空闲的时候再慢慢写入。
# 只有调用close()方法时，操作系统才保证把没有写入的数据全部写入磁盘。
# 忘记调用close()的后果是数据可能只写了一部分到磁盘，剩下的丢失了。所以，还是用with语句来得保险：
# 写入文件
with open('test.txt', 'w') as f:
    f.write('Hello, world!')
# 'r'：只读模式（默认模式，如果文件不存在会报错）。
# 'w'：只写模式（如果文件已存在则覆盖，如果文件不存在则创建）。
# 'a'：追加模式（如果文件不存在则创建，写入内容会追加到文件末尾）。
# 'b'：二进制模式（用于处理二进制文件，如图片等）。
# 't'：文本模式（默认模式，用于处理文本文件）。
# '+'：读写模式（用于同时读取和写入文件）。

# 'r+'：读写模式，文件必须存在，否则会报错。
# 'w+'：读写模式，如果文件存在则覆盖，如果文件不存在则创建。